﻿procedure;


  function dingo_CreatePlacePlan(Order : integer; TypePlaces : string) : string;
  var
    sl : TStringList;
  begin
    sl := TStringList.Create;
    try
      // poradi
      sl.Values['472323,11011'] := IntToStr(Order);
      // povolene typy pozic
      sl.Values['472325,11011'] := TypePlaces;
      //
      AppServer.InsertDBRecord(SourceName, '', '472322,11011', False, sl);
      Result := Format('%%,%%', [sl.Values['ic'], sl.Values['u']]);
    finally
      sl.Free;
    end;
  end;



var
  DS: TAppDataSet;
  SL: TStringList;
  idPer, ic, u: string;
  
  dingo_sl : TStringList;
  dingo_ds : TAppDataSet;
  dingo_sRouteID, dingo_sPlanID : string;
  dingo_iSet : integer;
  
  
begin
  
  AppServer.SetDSTransferData(SourceName,'6269,5',nttNonLicAndNonNLP,lttAll,[mtaInsert,mtaUpdate,mtaDelete],[mtaInsert]);
  AppServer.SetDSTransferData(SourceName,'6269,5',nttNonLicAndNLP,lttNonLangOrNonNLP,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'6269,5',nttLicAndNonNLP,lttLangOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'6269,5',nttLicAndNLP,lttNonNLPOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'6269,5',nttNLPOnly,lttNLPOnly,[mtaIUpdate],[]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttNonLicAndNonNLP,lttAll,[mtaInsert,mtaUpdate,mtaDelete],[mtaInsert]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttNonLicAndNLP,lttNonLangOrNonNLP,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttLicAndNonNLP,lttLangOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttLicAndNLP,lttNonNLPOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'9999,9999',nttNLPOnly,lttNLPOnly,[mtaIUpdate],[]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttNonLicAndNonNLP,lttAll,[mtaInsert,mtaUpdate,mtaDelete],[mtaInsert]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttNonLicAndNLP,lttNonLangOrNonNLP,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttLicAndNonNLP,lttLangOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttLicAndNLP,lttNonNLPOnly,[mtaInsert,mtaUpdate,mtaDelete],[]);
  AppServer.SetDSTransferData(SourceName,'165587,10',nttNLPOnly,lttNLPOnly,[mtaIUpdate],[]);
  M17059359_10;  // NEMAZAT, STANDARDNI SOUCAST REINSTALACE
  AppServer.SetSQLScript(SourceName,TargetPath + 'Reinstall_1111AD.sql');
  
  // ZS - legislativa 2024, nastaveni parametru (NESPOUSTET)
  if (legislation = '745998,10') then
  begin
    idPer := AppServer.GetDBKeyValues(SourceName, rmPrimary, '450391,10', '("546181,10" >= ''2024-01-01'') AND ("451082,10" = 0)');
    if (idPer <> '') then
    begin
      SL := TStringList.Create;
      try
        // KONFIGURACNI HODNOTY
        // Snizeni VZ ZP
        if (AppServer.GetDBAtrValue(SourceName, rmPrimary, MainLang, '450391,10', '467927,10', idPer) <> '0') then
          AppServer.SetDBAtrValue(SourceName, UserLang, '450391,10', '467927,10', idPer, '15440');
        // Maximalni vymerovaci zaklad SP
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '613554,10', idPer, '2110416');
        // % socialni pojisteni zamestnanec
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '467919,10', idPer, '7.1');
        // 1.redukcni hranice
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '6095109,10', idPer, '1466');
        // 2.redukcni hranice
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '6095111,10', idPer, '2199');
        // 3.redukcni hranice
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '6095113,10', idPer, '4397');
        // % socialni pojisteni organizace za zachranare a firemni hasice
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '39330171,10', idPer, '27.8');
        // Prumerna mzda pro ucely duchodoveho pojisteni
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '39000004,10', idPer, '43967');
        // Hranice hodinove sazby
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '39000008,10', idPer, '506');
        // Narok na dovolenou DPC
        AppServer.SetDBAtrValue(SourceName, MainLang, '448490,10', '577084,10', '448537,10', '1');
        // Narok na dovolenou DPP
        AppServer.SetDBAtrValue(SourceName, MainLang, '448490,10', '577084,10', '448541,10', '1');
        // Prumerna mzda v predchozim roce
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '29722984,10', idPer, '42427');
        // Minimalni vymerovai zaklad
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '587230,10', idPer, '18900');
        // Hranice pro narok na danovy bonus
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '54561,10098', idPer, '9450');
        // Normativni naklady na bydleni
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '4525887,10', idPer, '14197');
        // Minimalni mzda
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '1337323,10', idPer, '18900');
        // Minimalni hodinovy tarif
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '467917,10', idPer, '112.5');
        // Sleva na studenta
        AppServer.SetDBAtrValue(SourceName, MainLang, '450391,10', '2799926,10', idPer, '0');
        // limity danove tabulky
        DS := TAppDataSet.Create;
        try
          // DS Danova tabulka zalohove dane
          // 1. sazba 15%
          DS.SetDSParams(SourceName, rmPrimary, '484444,10', dsaFullNonVisible, '', '', '',
                         Format('("ic_b" = %%) AND ("u_b" = %%) AND ("484470,10" = 15)', [LByID(idPer), RByID(idPer)]));
          DS.NoMacros := true;
          DS.Open;
          if not DS.IsEmpty then
          begin
            DS.Edit;
            DS.FieldByName('484466,10').AsFloat := 131901;
            DS.PostNoConfirm;
          end;
          
          // 2. sazba 23%
          DS.Filter := Format('("ic_b" = %%) AND ("u_b" = %%) AND ("484470,10" = 23)', [LByID(idPer), RByID(idPer)]);
          if not DS.IsEmpty then
          begin
            DS.Edit;
            DS.FieldByName('484467,10').AsFloat := 131901;
            DS.PostNoConfirm;
          end;
        finally
          DS.Free;
        end;
        // Zarucena mzda
        AppServer.SetDBAtrValue(SourceName, MainLang, '22426511,10', '22426519,10', '2153021,9', '18900');
        AppServer.SetDBAtrValue(SourceName, MainLang, '22426511,10', '22426519,10', '2153022,9', '19500');
        AppServer.SetDBAtrValue(SourceName, MainLang, '22426511,10', '22426519,10', '2153023,9', '21300');
        AppServer.SetDBAtrValue(SourceName, MainLang, '22426511,10', '22426519,10', '2153028,9', '37800');
        // Zaruceny tarif  
        AppServer.SetDBAtrValue(SourceName, MainLang, '22426511,10', '22426552,10', '2153021,9', '112.50');
        AppServer.SetDBAtrValue(SourceName, MainLang, '22426511,10', '22426552,10', '2153022,9', '116.10');
        AppServer.SetDBAtrValue(SourceName, MainLang, '22426511,10', '22426552,10', '2153023,9', '126.80');
        AppServer.SetDBAtrValue(SourceName, MainLang, '22426511,10', '22426552,10', '2153028,9', '225');
        
        // MS 776 - konstanta
        if AppServer.ExistDBKeyValue(SourceName, rmPrimary, '18144,10', '2410547,9') then
          AppServer.SetDBAtrValue(SourceName, MainLang, '18144,10', '601380,10', '2410547,9', '4.5');
        
        // MS 197 - vzorecek pro vypocet castky
        if (AppServer.GetDBLinkKeyValue(SourceName, rmPrimary, '599542,10', '2414202,9', idPer) = '') then
        begin
          // vazba vzorecku na obdobi
          SL.Clear;
          SL.Add('ic_a=2414202');
          SL.Add('u_a=9');
          SL.Add('ic_b='+LByID(idPer));
          SL.Add('u_b='+RByID(idPer));
          AppServer.InsertDBRecord(SourceName, '', '599542,10', false, SL);
          ic := SL.Values['ic'];
          u := SL.Values['u'];
          // vypocet castky - vazba na vzorecek Konstanta  * Sazba
          SL.Clear;
          SL.Add('ic_a='+ic);
          SL.Add('u_a='+u);
          SL.Add('ic_b=601498');
          SL.Add('u_b=10');
          AppServer.InsertDBRecord(SourceName, '', '599808,10', false, SL);
          ic := '';
          u := '';
        end;
      finally
        SL.Free;
      end;
    end;
  end;
  // ZS konec
  
  // Dingo - start (NESPOUSTET)
  // WMS: odebrani role uzivatelu WMS z ciselniku zbozi
  M230829_10212(SourceName, '3460,10', AppServer.GetDBKeyValuesEx(SourceName, rmPrimary, '457355,11011', '', '3460,10', [], '', 0, ftID), ftID, True);
  
  // WMS: vychozi skladova trasa
  dingo_sRouteID := AppServer.GetDBKeyValuesEx(SourceName, rmPrimary, '471886,11011', '', '', [], '', 0, ftID, 1);
  if dingo_sRouteID = '' then
    begin
      dingo_sl := TStringList.Create;
      dingo_ds := TAppDataSet.Create;
      try
        // skladove pozice s vyplnenym poradim
        dingo_ds.SetDSParams(SourceName, rmPrimary, '956476,10', dsaViewNonVisible);
        dingo_ds.Filter := '"144936,11011" is not null';
        dingo_ds.OrderBy := '"144936,11011"';
        dingo_ds.NoMacros := True;
        dingo_ds.GetAll := True;
        dingo_ds.Open;
        
        // existuje vyplnene poradi pro terminal
        if not dingo_ds.IsEmpty then
          begin
            // skladova trasa
            dingo_sl.Clear;
            dingo_sl.Values['1043023,10'] := SubString(AppServer.GetLangText(SourceName, MainLang, '836145,10', []), 1, 100);
            AppServer.InsertDBRecord(SourceName, '', '471886,11011', False, dingo_sl);
            dingo_sRouteID := Format('%%,%%', [dingo_sl.Values['ic'], dingo_sl.Values['u']]);
            
            // skladove pozice v trase
            while not dingo_ds.EOF do
              begin
                dingo_sl.Clear;
                dingo_sl.Values['ic_a'] := LByID(dingo_sRouteID);
                dingo_sl.Values['u_a'] := RByID(dingo_sRouteID);
                dingo_sl.Values['ic_b'] := dingo_ds.FieldByName('ic').AsString;
                dingo_sl.Values['u_b'] := dingo_ds.FieldByName('u').AsString;
                dingo_sl.Values['3281051,10'] := dingo_ds.FieldByName('144936,11011').AsString;
                AppServer.InsertDBRecord(SourceName, '', '472155,11011', False, dingo_sl);
                
                //
                dingo_ds.Next;
              end;
            
            // pripojeni skladove trasy k definici davky
            dingo_ds.Close;
            dingo_ds.SetDSParams(SourceName, rmPrimary, '139136,11011', dsaReadNonVisible);
            dingo_ds.Filter := '"145025,11011" >= 0 or "169629,11011" >= 0 or "468545,11011.ic" is not null';
            dingo_ds.Open;
            
            //
            while not dingo_ds.EOF do
              begin
                // skladova trasa v definici
                dingo_sl.Clear;
                dingo_sl.Values['ic_a'] := dingo_ds.FieldByName('ic').AsString;
                dingo_sl.Values['u_a'] := dingo_ds.FieldByName('u').AsString;
                dingo_sl.Values['ic_b'] := LByID(dingo_sRouteID);
                dingo_sl.Values['u_b'] := RByID(dingo_sRouteID);
                AppServer.InsertDBRecord(SourceName, '', '472173,11011', False, dingo_sl);
                
                // navrh vychozi pozice
                if not dingo_ds.FieldByName('145025,11011').IsNull and (dingo_ds.FieldByName('145025,11011').AsInteger >= 0) then
                  begin
                    dingo_sPlanID := dingo_CreatePlacePlan(10, dingo_ds.FieldByName('169638,11011').AsString);
                    
                    dingo_sl.Clear;
                    dingo_sl.Values['ic_a'] := dingo_ds.FieldByName('ic').AsString;
                    dingo_sl.Values['u_a'] := dingo_ds.FieldByName('u').AsString;
                    dingo_sl.Values['ic_b'] := LByID(dingo_sPlanID);
                    dingo_sl.Values['u_b'] := RByID(dingo_sPlanID);
                    // navrh vychozi skladove pozice
                    dingo_sl.Values['472026,11011'] := IntToStr(dingo_ds.FieldByName('145025,11011').AsInteger + 1);
                    //
                    AppServer.InsertDBRecord(SourceName, '', '472020,11011', False, dingo_sl);
                  end;
                
                // navrh cilove pozice
                if not dingo_ds.FieldByName('169629,11011').IsNull and (dingo_ds.FieldByName('169629,11011').AsInteger >= 0) then
                  begin
                    dingo_sPlanID := dingo_CreatePlacePlan(20, dingo_ds.FieldByName('169639,11011').AsString);
                    
                    dingo_sl.Clear;
                    dingo_sl.Values['ic_a'] := dingo_ds.FieldByName('ic').AsString;
                    dingo_sl.Values['u_a'] := dingo_ds.FieldByName('u').AsString;
                    dingo_sl.Values['ic_b'] := LByID(dingo_sPlanID);
                    dingo_sl.Values['u_b'] := RByID(dingo_sPlanID);
                    // navrh cilove skladove pozice
                    dingo_sl.Values['472336,11011'] := IntToStr(dingo_ds.FieldByName('169629,11011').AsInteger);
                    //
                    AppServer.InsertDBRecord(SourceName, '', '472020,11011', False, dingo_sl);
                  end;
                
                // vybrana cilova pozice
                if not dingo_ds.FieldByName('468545,11011.ic').IsNull then
                  begin
                    dingo_sPlanID := dingo_CreatePlacePlan(30, dingo_ds.FieldByName('169639,11011').AsString);
                    
                    // vybrana skladova pozice
                    dingo_sl.Clear;
                    dingo_sl.Values['ic_a'] := LByID(dingo_sPlanID);
                    dingo_sl.Values['u_a'] := RByID(dingo_sPlanID);
                    dingo_sl.Values['ic_b'] := dingo_ds.FieldByName('468545,11011.ic_b').AsString;
                    dingo_sl.Values['u_b'] := dingo_ds.FieldByName('468545,11011.u_b').AsString;
                    AppServer.InsertDBRecord(SourceName, '', '472327,11011', False, dingo_sl);
                    
                    // navrh skladove pozice
                    dingo_sl.Clear;
                    dingo_sl.Values['ic_a'] := dingo_ds.FieldByName('ic').AsString;
                    dingo_sl.Values['u_a'] := dingo_ds.FieldByName('u').AsString;
                    dingo_sl.Values['ic_b'] := LByID(dingo_sPlanID);
                    dingo_sl.Values['u_b'] := RByID(dingo_sPlanID);
                    // navrh cilove skladove pozice
                    dingo_sl.Values['472336,11011'] := '0';
                    //
                    AppServer.InsertDBRecord(SourceName, '', '472020,11011', False, dingo_sl);
                  end;
                
                //
                dingo_ds.Next;
              end;
          end;
      finally
        dingo_ds.Free;
        dingo_sl.Free;
      end;
    end;
  
  // definice davek: spusteni navrhu skladovych pozic
  dingo_sl := TStringList.Create;
  dingo_ds := TAppDataSet.Create;
  try
    dingo_ds.SetDSParams(SourceName, rmPrimary, '139136,11011', dsaReadNonVisible);
    dingo_ds.Filter := '"473725,11011" is null and "473726,11011" is null and "139150,11011" <> 6';
    dingo_ds.NoMacros := True;
    dingo_ds.Distinct := True;
    dingo_ds.GetAll := True;
    dingo_ds.Open;
    
    while not dingo_ds.EOF do
      begin
        dingo_sl.Clear;
        
        // spusteni navrhu vychozi pozice
        if dingo_ds.FieldByName('473725,11011').IsNull then
          if dingo_ds.FieldByName('139150,11011').AsInteger <> 2 then
            begin
              dingo_iSet := 0;
              // pri rozdeleni davky
              SetBitState(dingo_iSet, 1, GetBitState(dingo_ds.FieldByName('301623,11011').AsInteger, 2) or GetBitState(dingo_ds.FieldByName('301623,11011').AsInteger, 3) or GetBitState(dingo_ds.FieldByName('301623,11011').AsInteger, 2));
              // existude definice navrhu
              if AppServer.GetDBKeyValues(SourceName, rmPrimary, '472020,11011', Format('"ic_a" = %% and "u_a" = %% and "472026,11011" is not null', [dingo_ds.FieldByName('ic').AsString, dingo_ds.FieldByName('u').AsString])) <> '' then
                begin
                  SetBitState(dingo_iSet, 0, True); // rucni
                  SetBitState(dingo_iSet, 3, True); // pri spusteni davky
                  SetBitState(dingo_iSet, 4, True); // po zpracovani polozky
                end;
              //
              if dingo_iSet > 0 then
                dingo_sl.Add('473717,11011=' + IntToStr(dingo_iSet));
            end;
        
        // spusteni navrhu cilove pozice
        if dingo_ds.FieldByName('473726,11011').IsNull then
          if dingo_ds.FieldByName('139150,11011').AsInteger <> 1 then
            begin
              dingo_iSet := 0;
              // pri rozdeleni davky
              SetBitState(dingo_iSet, 1, GetBitState(dingo_ds.FieldByName('301623,11011').AsInteger, 4) or GetBitState(dingo_ds.FieldByName('301623,11011').AsInteger, 5) or GetBitState(dingo_ds.FieldByName('301623,11011').AsInteger, 10));
              // existude definice navrhu
              if AppServer.GetDBKeyValues(SourceName, rmPrimary, '472020,11011', Format('"ic_a" = %% and "u_a" = %% and "472336,11011" is not null', [dingo_ds.FieldByName('ic').AsString, dingo_ds.FieldByName('u').AsString])) <> '' then
                begin
                  SetBitState(dingo_iSet, 0, True); // rucni
                  SetBitState(dingo_iSet, 3, True); // pri spusteni davky
                  SetBitState(dingo_iSet, 4, True); // po zpracovani polozky
                end;
              //
              if dingo_iSet > 0 then
                dingo_sl.Add('473719,11011=' + IntToStr(dingo_iSet));
            end;
        
        // aktualizace davky
        if dingo_sl.Count > 0 then
          AppServer.UpdateDBRecord(SourceName, '', '139128,11011', dingo_ds.GetPKValue, dingo_sl);
        
        //
        dingo_ds.Next;
      end;
  finally
    dingo_ds.Free;
    dingo_sl.Free;
  end;
  
  // Dingo - end
  
  
  
  
  
end.